package com.atguigu.gmall.pms.service.impl;

import com.atguigu.gmall.pms.entity.*;
import com.atguigu.gmall.pms.entity.vo.SkuVo;
import com.atguigu.gmall.pms.entity.vo.SpuAttrValueVo;
import com.atguigu.gmall.pms.entity.vo.SpuVo;
import com.atguigu.gmall.pms.feign.GmallSmsClient;
import com.atguigu.gmall.pms.mapper.SkuMapper;
import com.atguigu.gmall.pms.mapper.SpuDescMapper;
import com.atguigu.gmall.pms.service.*;
import com.atguigu.gmall.sms.vo.SkuSaleVo;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SpuMapper;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody;


@Service("spuService")
public class SpuServiceImpl extends ServiceImpl<SpuMapper, SpuEntity> implements SpuService {


    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SpuEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SpuEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public PageResultVo querySpuByCidAanPage(Long cid, PageParamVo paramVo) {
        QueryWrapper<SpuEntity>wrapper=new QueryWrapper<>();
       if (cid!=0){
          wrapper.eq("category_id",cid);
       }
        String key = paramVo.getKey();
       if (StringUtils.isNotBlank(key)){
           wrapper.and(t->t.like("id",key).or().like("name",key));
       }
        return new PageResultVo(this.page(paramVo.getPage(),wrapper));
    }


//    @Autowired
//    private SpuDescMapper spuDescMapper;

    @Autowired
    private SpuAttrValueService baseAttrService;
    @Autowired
    private SkuMapper skuMapper;
    @Autowired
    private SkuImagesService imagesService;
    @Autowired
    private SkuAttrValueService saleAttrService;
    @Autowired
    private GmallSmsClient smsClient;
   /* @Override
    public void bigSave(SpuVo spu) {
        // 1.保存spu相关信息
        // 1.1. 保存pms_spu
        spu.setCreateTime(new Date());
        spu.setUpdateTime(spu.getCreateTime());
        this.save(spu);
        Long spuId = spu.getId();
        // 1.2. 保存pms_spu_desc
        List<String> spuImages = spu.getSpuImages();
        SpuDescEntity spuDescEntity = new SpuDescEntity();
        spuDescEntity.setSpuId(spuId);
        spuDescEntity.setDecript(StringUtils.join(spuImages, ","));
         this.spuDescMapper.insert(spuDescEntity);
        // 1.3. 保存pms_spu_attr_value
        List<SpuAttrValueVo> baseAttrs = spu.getBaseAttrs();
           if (!CollectionUtils.isEmpty(baseAttrs)){
               this.baseAttrService.saveBatch(baseAttrs.stream().map(spuAttrValueVo-> {
                   SpuAttrValueEntity spuAttrValueEntity=new SpuAttrValueEntity();
                   BeanUtils.copyProperties(spuAttrValueVo,spuAttrValueEntity);
                   spuAttrValueEntity.setSpuId(spuId);
                   return spuAttrValueEntity;
               }).collect(Collectors.toList()));
           }
        // 2.保存sku相关信息
        List<SkuVo> skus = spu.getSkus();
           if (CollectionUtils.isEmpty(skus)){
               return;
           }
           skus.forEach(skuVo -> {
               // 2.1. 保存pms_sku
               skuVo.setSpuId(spuId);
               skuVo.setBrandId(spu.getBrandId());
               skuVo.setCategoryId(spu.getCategoryId());
               List<String> images = skuVo.getImages();
               // 如果没有指定默认图片并且图片列表不为空的情况下，设置第一张图片为默认图片
               if (StringUtils.isEmpty(skuVo.getDefaultImage())&& !CollectionUtils.isEmpty(images)){
                   skuVo.setDefaultImage(images.get(0));
               }
              this.skuMapper.insert(skuVo);
               Long skuId = skuVo.getId();
               // 2.2. 保存pms_sku_images
               if (!CollectionUtils.isEmpty(images)){
                   this.imagesService.saveBatch(images.stream().map(image->{
                       SkuImagesEntity skuImagesEntity =new SkuImagesEntity();
                       skuImagesEntity.setSkuId(skuId);
                       skuImagesEntity.setUrl(image);
                       skuImagesEntity.setDefaultStatus(StringUtils.equals(skuVo.getDefaultImage(),image)?1:0);
                       return skuImagesEntity;
                   }).collect(Collectors.toList()));
               }
               // 2.3. 保存pms_sku_attr_value
               List<SkuAttrValueEntity>  saleAttrs = skuVo.getSaleAttrs();
               if (!CollectionUtils.isEmpty(saleAttrs)){
                   saleAttrs.forEach(skuAttrValueEntity -> {
                       skuAttrValueEntity.setSkuId(skuId);
                   });
                   this.saleAttrService.saveBatch(saleAttrs);
               }
               // 3.保存营销信息
               SkuSaleVo skuSaleVo=new SkuSaleVo();
               BeanUtils.copyProperties(skuVo,skuSaleVo);
               skuSaleVo.setSkuId(skuVo.getId());
               this.smsClient.saveSales(skuSaleVo);
           });
*/
   @Autowired
    private SpuDescService spuDescService;
   //FileNotFoundException异常回滚，ArithmeticException不回滚（测试）
//   @Transactional(rollbackFor = FileNotFoundException.class,noRollbackFor = ArithmeticException.class)
//              超时时间3秒（测试）
//   @Transactional(timeout = 3)
    //只读事务（测试）
//    @Transactional(readOnly = true)
//    @Transactional

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @GlobalTransactional
   @Override

   public void bigSave(SpuVo spu) throws FileNotFoundException {
       /// 1.保存spu相关
       // 1.1. 保存spu基本信息 spu_info
       Long spuId = saveSpu(spu);
       // 1.2. 保存spu的描述信息 spu_info_desc
       this.spuDescService.saveSpuDesc(spu, spuId);
//       int a =1/0;
//       FileInputStream x =new FileInputStream("xxx");
//       try {
//           TimeUnit.SECONDS.sleep(5);
//       } catch (InterruptedException e) {
//           e.printStackTrace();
//       }
       // 1.3. 保存spu的规格参数信息
       saveBaseAttr(spu, spuId);
       /// 2. 保存sku相关信息
       saveSku(spu, spuId);

       this.rabbitTemplate.convertAndSend("PMS_SPU_EXCHANGE","item.insert",spuId);

   }
   @Transactional
    public Long saveSpu(SpuVo spu ) {
        spu.setCreateTime(new Date());
        spu.setUpdateTime(spu.getCreateTime());
        this.save(spu);
       return spu.getId();


   }
//    @Transactional(propagation = Propagation.REQUIRES_NEW)
//    public void saveSpuDesc(SpuVo spu, Long spuId) {
//       List<String> spuImages = spu.getSpuImages();
//        SpuDescEntity spuDescEntity = new SpuDescEntity();
//        spuDescEntity.setSpuId(spuId);
//        spuDescEntity.setDecript(StringUtils.join(spuImages, ","));
//        this.spuDescMapper.insert(spuDescEntity); }
    public void saveBaseAttr(SpuVo spu, Long spuId) {
       List<SpuAttrValueVo> baseAttrs = spu.getBaseAttrs();
        if (!CollectionUtils.isEmpty(baseAttrs)){
            this.baseAttrService.saveBatch(baseAttrs.stream().map(spuAttrValueVo-> {
                SpuAttrValueEntity spuAttrValueEntity=new SpuAttrValueEntity();
                BeanUtils.copyProperties(spuAttrValueVo,spuAttrValueEntity);
                spuAttrValueEntity.setSpuId(spuId);
                return spuAttrValueEntity;
            }).collect(Collectors.toList()));
        }}
    public void saveSku(SpuVo spu, Long spuId) {   List<SkuVo> skus = spu.getSkus();
        if (CollectionUtils.isEmpty(skus)){
            return;
        }
        skus.forEach(skuVo -> {
            // 2.1. 保存pms_sku
            skuVo.setSpuId(spuId);
            skuVo.setBrandId(spu.getBrandId());
            skuVo.setCategoryId(spu.getCategoryId());
            List<String> images = skuVo.getImages();
            // 如果没有指定默认图片并且图片列表不为空的情况下，设置第一张图片为默认图片
            if (StringUtils.isEmpty(skuVo.getDefaultImage())&& !CollectionUtils.isEmpty(images)){
                skuVo.setDefaultImage(images.get(0));
            }
            this.skuMapper.insert(skuVo);
            Long skuId = skuVo.getId();
            // 2.2. 保存pms_sku_images
            if (!CollectionUtils.isEmpty(images)){
                this.imagesService.saveBatch(images.stream().map(image->{
                    SkuImagesEntity skuImagesEntity =new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setUrl(image);
                    skuImagesEntity.setDefaultStatus(StringUtils.equals(skuVo.getDefaultImage(),image)?1:0);
                    return skuImagesEntity;
                }).collect(Collectors.toList()));
            }
            // 2.3. 保存pms_sku_attr_value
            List<SkuAttrValueEntity>  saleAttrs = skuVo.getSaleAttrs();
            if (!CollectionUtils.isEmpty(saleAttrs)){
                saleAttrs.forEach(skuAttrValueEntity -> {
                    skuAttrValueEntity.setSkuId(skuId);
                });
                this.saleAttrService.saveBatch(saleAttrs);
            }
            // 3.保存营销信息
            SkuSaleVo skuSaleVo=new SkuSaleVo();
            BeanUtils.copyProperties(skuVo,skuSaleVo);
            skuSaleVo.setSkuId(skuVo.getId());
            this.smsClient.saveSales(skuSaleVo);
        }); }


       }



